﻿// See https://aka.ms/new-console-template for more information
class Program
{
    static void Main(string[] args)
    {
        var apple = new Apple() { Color = "Red" };
        Book book = new Book() { Name = "C#入门详解" };
        var box = new Box() { carGo = apple };
        Console.WriteLine(box.carGo);//此时carGo是Object 类型 没有Apple的Color属性  若要访问则只能类型转化
        Console.WriteLine((box.carGo as Apple)?.Color);//且此解决方案不是最好的 相对来说是变麻烦了

        //泛型特化(具体化)
        Box<Apple> box1 = new Box<Apple>() { CarGo =apple};
        Box<Book> box2 = new Box<Book>() { CarGo = book };
        Console.WriteLine(box1.CarGo.Color);
        Console.WriteLine(box2.CarGo.Name);
    }
    //当越来越多的商品上架销售 按此方式进行销售 要建立越来越多的类 

    //泛型和接口相似?  通过接口来管理成员函数  泛型管理属性字段?
    class Apple
    {
        public string Color { get; set; }
    }

    class Book
    {

        public string Name { get; set; }
    }

    class Box
    {
        //此方法每次调用时需每次都新增属性进去 若实例化不使用其余属性则会造成资源不必要的浪费

        //若属性没用新增或删除  则有可能会造成程序错误

        //这种情况被称为  成员膨胀


        //public Apple apple { get; set; }
        //public Book book { get; set; }

        public Object carGo { get; set; }
    }

    //普通类改成泛型类
    class Box<TCargo>
    {
        public  TCargo CarGo { get; set; }
    }
}
//class BookBox
//{
//    public Book CarGo { get; set; }
//}

//class AppleBox
//{
//    public Apple CarGo { get; set; }
//}





